This page last changed on Oct 02, 2006 by juanca.

Fases

Todos los compiladores deben realizar las funciones descritas para cada fase, pero muchos compiladores unen más de una fase en un solo módulo o grupo de rutinas.

análisis (gr. análysis, de analyo, desatar)
1 m. Distinción y separación de las partes de un todo hasta llegar a conocer los principios o elementos de éste. 2 GRAM. Distinción de las oraciones que componen un discurso; de las categorías, accidentes y otras propiedades gramaticales de las palabras: ~ lógico, examen de los elementos de una oración y de las relaciones que las oraciones guardan entre sí; ~ estilístico, estudio del valor expresivo de los elementos lingüísticos de un texto.

síntesis (gr. synthesis)
1 f. Composición de un todo por la reunión de sus partes. 2 Suma y compendio de una materia.

Análisis Léxico (Análisis Lineal)

Un Analizador Léxico (o analizador lineal) transforma la secuencia de símbolos de entrada en una secuencia de componentes (símbolos) léxicos sobre la cual es más fácil hacer luego el análisis sintáctico. El A.L. lee caracteres de entrada y los agrupa en secuencias que tienen significado dentro de la estructura sintáctica del lenguaje fuente.

Un analizador léxico es un Traductor que actúa en la primera fase de un proceso de compilación.

Ejemplo

La siguiente expresión:

a = (b + 1) >> 2; // comentario 

es leída por el analizador léxico como una secuencia de caracteres:

a   =   ( b + 1 )   > > 2   ;   / /   c o m e n t a r i o

el analizador léxico la transforma en una secuencia de componentes léxicos:

ident = ( ident + const ) op const ;
a     b   1   >> 2  

En ocasiones el AL interactúa con la tabla de símbolos y almacena allí la información sobre los identificadores que consigue:

ident = ( ident + const ) op const ;
1     2   3   >> 4  

Tabla de Símbolos

pos tipo valor
1 ident a
2 ident b
3 const 1
4 const 2
Eficiencia

Se usa un AL independiente para hacer más fácil la tarea de Analizador Sintactico. Como un AL básicamente agrupa caracteres, su función se puede hacer muy eficiente.

Desechar Información

El AL puede desechar información que no es relevante para el significado del programa, como espacios en blanco y comentarios.

Lexema

Un Lexema (lexeme) es una cadena de caracteres que debe ser tratada en conjunto en el lenguaje fuente:

mcd
(
>>

Componente Léxico

Un Componente Lexico es el tipo asociado a un subconjunto particular de lexemas, como los identificadores, o números en un lenguaje de programación. A cada componente léxico se asocia un patrón que concuerda con los lexemas del conjunto asociado al componente léxico.

c.l. lexemas
patrón
ident mdc, tmp2, total letra seguida de letras o números

Análisis Sintáctico (Análisis Jerárquico en A.S.U.)

El Analisis Sintactico descubre la estructura sintáctica (normalmente jerárquica) de la cadena de entrada usando las reglas que definen las cadenas válidas en el Lenguaje fuente.

Dichas reglas viene expresadas en forma de una Gramatica que describe de manera relativamente breve las frases o secuencias válidas en un Lenguaje. Una gramática también describe la estructura jerárquica o sintáctica de las frases de un lenguaje.

Una gramática es un conjunto de reglas de la forma: a ? ß

Por ejemplo:

expre → expre + expre

Cada regla se llama una producción, y el operador "?" puede leerse como tiene la siguiente forma, o tiene la siguiente expansión.

Este es un ejemplo de una gramática para las expresiones aritméticas:

E → E + T | T
E → E - T | T
T → T * F | F
T → T / F | F
F → ( E ) | id | num

Árbol de Análisis Sintáctico (Parse Tree)

El arbol sintáctico es un árbol que refleja la estructura sintáctica de la entrada. Ese tipo de árbol se llama árbol de análisis sintáctico (también árbol de sintaxis concreta, o arbol de derivación).

Árbol Sintáctico (Abstracto)

Para facilitar la fase de análisis semántico, el analizador sintáctico puede transformar el árbol de sintaxis cocreta en un árbol de sintaxis abstracta o árbol sintáctico a secas, donde se elimina la información sintáctica que no es relevante para la compresión del significado lógico del programa:

Análisis Semántico

El análisis semántico verifica que el árbol sintáctico tenga un significado válido dentro de las reglas semánticas del lenguaje. Por ejemplo, el analiador semántico verifica que:

  • En una asignación, el tipo de la variable concuerde con el tipo de la expresión asignada.
  • Que los subíndices se apliquen a variables tipo arreglo y no a otras.
  • Que las variables estén declaradas antes de ser usadas.

Generación de Código Intermedio

La fase de generación de código intermedio se ocupa de generar instrucciones para una máquina virtual genérica a partir de la información recopilada en las fases previas de análisis . La razón por la cual no se genera código objeto directamente es para permitir que la fase de optimización sea genérica y por lo tanto portátil (independiente del código objeto específico).

Optimización

La fase de optimización se encarga de transformar el código intermedio en uno de función equivalente pero de menor tamaño o de menor tiempo de ejecución.

Algunas de las transformaciones que puede llevar a cabo la fase de optimización son:

  • Eliminar el cálculo de expresiones cuyo valor no se usa.
  • Fundir en uno solo el cálculo repetido de la misma expresión.
  • Sacar de los lazos las expresiones cuyo valor no cambia en el lazo.
  • Reducir el uso de memoria local reutilizando el espacio de una variable muerta.

Generación de Código Objeto

La fase de generación de código objeto se encarga de generar el programa usando el juego de instrucciones específico de la máquina o CPU objeto, y el formato para archivos ejecutables del sistema operativo. Entre otras cosas, también se le asignan direcciones definitivas a las rutinas y variables que componen el programa.


fases.gif (image/gif)
Document generated by Confluence on Oct 04, 2010 11:25